package ihm;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.MemoryImageSource;
import java.util.Vector;
import javax.swing.JPanel;
import modelesObjet.ModelePluviometre;
import modelesObjet.ModelePointFond;
import visualisationRadar.VisualisationRadar;

public class VisuZoom extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 7691601298352614553L;
	private int[] zoomPixmap;
	private Vector<? extends ModelePointFond> pointsCarteZ;
	private Vector<? extends ModelePluviometre> pointsPluvio;
	private Point souris;
	private boolean flagFondZ;
	private boolean flagPointRadar;
	private boolean flagPluvios;
	private VisualisationRadar visualisationRadar;
	Point ptNW;
	Point ptSE;
	
	public VisuZoom(VisualisationRadar visualisationRadar) 
	{		
		super();
		this.visualisationRadar=visualisationRadar;
		setPreferredSize(new Dimension(FenetreZoom.tailleZoom*FenetreZoom.facteurZoom,FenetreZoom.tailleZoom*FenetreZoom.facteurZoom));
	}

	public void miseAJourZoom(MouseEvent e){
		zoomPixmap=null;
		souris=new Point(e.getX(),e.getY());
		if(souris.x>0 && souris.x<VisualisationRadar.NBPIXELS && souris.y>0 && souris.y<VisualisationRadar.NBPIXELS)
		{
			if (visualisationRadar.getObjetRadar().getImageRadar()!=null && visualisationRadar.getObjetRadar().getImageRadar().getPixels()!=null){
				int[] pixmap=visualisationRadar.getObjetRadar().getImageRadar().getPixels().getTableauPixels();

				flagFondZ=visualisationRadar.getFond();
				flagPointRadar=visualisationRadar.getPointRadar();
				flagPluvios=visualisationRadar.isPluvios();

				if (flagFondZ) pointsCarteZ=visualisationRadar.getObjetRadar().getImageRadar().getFondCarte().getPoints();
				if (flagPluvios) pointsPluvio=visualisationRadar.getObjetRadar().getImageRadar().getPluviometres().getVecteurPluviometres();
				//				String chaine="pixel ("+souris.x+" "+souris.y+")  valeur : "+
				//				radar.getObjetRadar().getValeurChamp(souris.y*512+souris.x);
				zoomPixmap=new int[FenetreZoom.tailleZoom*FenetreZoom.tailleZoom];
				int k=0;
				 ptNW=new Point((souris.x)-FenetreZoom.tailleZoom/2,(souris.y)-FenetreZoom.tailleZoom/2);
				 ptSE=new Point((souris.x)+FenetreZoom.tailleZoom/2,(souris.y)+FenetreZoom.tailleZoom/2);
				for(int j=ptNW.y;j<ptSE.y;j++)
				{
					for(int i=ptNW.x;i<ptSE.x;i++)
					{				
						if(ptNW.x<0 || ptNW.x>VisualisationRadar.NBPIXELS) 
							zoomPixmap[k]=0;
						else
							if(ptSE.x<0 || ptSE.x>VisualisationRadar.NBPIXELS) 
								zoomPixmap[k]=0;
							else	
								if(ptNW.y<0 || ptNW.y>VisualisationRadar.NBPIXELS) 
									zoomPixmap[k]=0;
								else
									if(ptSE.y<0 || ptSE.y>VisualisationRadar.NBPIXELS) 
										zoomPixmap[k]=0;
									else
										zoomPixmap[k]=pixmap[j*VisualisationRadar.NBPIXELS+i];
						k++;
					}
				}	
				repaint();
			}
		}
	}

	public void miseAJourZoom(){
		zoomPixmap=null;
		if(souris.x>0 && souris.x<VisualisationRadar.NBPIXELS && souris.y>0 && souris.y<VisualisationRadar.NBPIXELS)
		{
			if (visualisationRadar.getObjetRadar().getImageRadar()!=null && 
					visualisationRadar.getObjetRadar().getImageRadar().getPixels()!=null){
				int[] pixmap=visualisationRadar.getObjetRadar().getImageRadar().getPixels().getTableauPixels();

				flagFondZ=visualisationRadar.getFond();
				flagPointRadar=visualisationRadar.getPointRadar();
				flagPluvios=visualisationRadar.isPluvios();

				if (flagFondZ) pointsCarteZ=visualisationRadar.getObjetRadar().getImageRadar().getFondCarte().getPoints();
				if (flagPluvios) pointsPluvio=visualisationRadar.getObjetRadar().getImageRadar().getPluviometres().getVecteurPluviometres();
				
				//				String chaine="pixel ("+souris.x+" "+souris.y+")  valeur : "+
				//				radar.getObjetRadar().getValeurChamp(souris.y*512+souris.x);
				zoomPixmap=new int[FenetreZoom.tailleZoom*FenetreZoom.tailleZoom];
				int k=0;
				 ptNW=new Point((souris.x)-FenetreZoom.tailleZoom/2,(souris.y)-FenetreZoom.tailleZoom/2);
				 ptSE=new Point((souris.x)+FenetreZoom.tailleZoom/2,(souris.y)+FenetreZoom.tailleZoom/2);
				for(int j=ptNW.y;j<ptSE.y;j++)
				{
					for(int i=ptNW.x;i<ptSE.x;i++)
					{				
						if(ptNW.x<0 || ptNW.x>VisualisationRadar.NBPIXELS) 
							zoomPixmap[k]=0;
						else
							if(ptSE.x<0 || ptSE.x>VisualisationRadar.NBPIXELS) 
								zoomPixmap[k]=0;
							else	
								if(ptNW.y<0 || ptNW.y>VisualisationRadar.NBPIXELS) 
									zoomPixmap[k]=0;
								else
									if(ptSE.y<0 || ptSE.y>VisualisationRadar.NBPIXELS) 
										zoomPixmap[k]=0;
									else
										zoomPixmap[k]=pixmap[j*VisualisationRadar.NBPIXELS+i];
						k++;
					}
				}	
				repaint();
			}
		}
	}
	
	@Override
	public void paintComponent(Graphics g)
	{	
		try{
			Graphics2D g2 = (Graphics2D) g;
			super.paintComponent(g2);
			Image imageZoom;
			imageZoom = createImage (new MemoryImageSource
					(FenetreZoom.tailleZoom, FenetreZoom.tailleZoom,zoomPixmap, 0, FenetreZoom.tailleZoom));
			AffineTransform transformationZoom = AffineTransform.getScaleInstance(FenetreZoom.facteurZoom, FenetreZoom.facteurZoom);

			g2.drawImage(imageZoom,transformationZoom, null);
			
			if(flagFondZ)
				afficherFondZ(g,pointsCarteZ);
			if(flagPluvios)
				afficherPluviosZ(g,pointsPluvio);
			if(flagPointRadar)
			{
				g.setColor(Color.black);
				g.drawLine((255-ptNW.x)*(int)transformationZoom.getScaleX(), (252-ptNW.y)*(int)transformationZoom.getScaleY(),
						(255-ptNW.x)*(int)transformationZoom.getScaleX(),(258-ptNW.y)*(int)transformationZoom.getScaleY());
				g.drawLine((252-ptNW.x)*(int)transformationZoom.getScaleX(), (255-ptNW.y)*(int)transformationZoom.getScaleY(),
						(258-ptNW.x)*(int)transformationZoom.getScaleX(),(255-ptNW.y)*(int)transformationZoom.getScaleY());
			}

		}catch(Exception ex){
			//ex.printStackTrace();
			Font maFont=new Font("Dialog", Font.PLAIN, 30) ;
			g.setFont(maFont);
			g.drawString("Pas de zoom ",100,200);
			g.drawString("à afficher ",100,250);
		}
	}

	public void afficherFondZ(Graphics g, Vector<? extends ModelePointFond> ptsCarteZ) 
	{
		/* dessine le fond de carte*/
		ModelePointFond p1,p2;
		int  nblignes=ptsCarteZ.size();
		int i1,i2,j1,j2;
		p1=ptsCarteZ.get(0);
	
		for (int k=1;k<nblignes-2;k++)
		{ 
			p2=ptsCarteZ.get(k);
			i1=p1.getX();
			i2=p2.getX();
			j1=p1.getY();
			j2=p2.getY();

			if (i1>=souris.x-FenetreZoom.tailleZoom/2 && i1 <souris.x+FenetreZoom.tailleZoom/2
					&& j1>= souris.y-FenetreZoom.tailleZoom/2 && j1< souris.y+FenetreZoom.tailleZoom/2
					&& i2>=souris.x-FenetreZoom.tailleZoom/2 && i2 <souris.x+FenetreZoom.tailleZoom/2 
					&& j2>=souris.y-FenetreZoom.tailleZoom/2 && j2<souris.y+FenetreZoom.tailleZoom/2 )
			{
				if (p2.getCouleur()==p1.getCouleur() ) 
				{
					if(  p2.getCouleur()==1)
						g.setColor(Color.BLUE );
					else
						if (  p2.getCouleur()==7 || p2.getCouleur()==9)
							g.setColor(Color.CYAN);
						else
							if (  p2.getCouleur()==5 )
								g.setColor(Color.RED);
							else
								if (  p2.getCouleur()==3 )
									g.setColor(Color.BLACK);
					g.drawLine((i1-(souris.x-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom,(j1-(souris.y-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom,
								(i2-(souris.x-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom,(j2-(souris.y-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom); 
				}
			}
			p1=ptsCarteZ.get(k);
		}  
	}

	//--affichage des pluvios
	public void afficherPluviosZ(Graphics g, Vector<? extends ModelePluviometre> vecteurPluvios) 
	{
		/* dessine le fond de carte*/
		ModelePluviometre p1;
		int  nblignes=vecteurPluvios.size();
		int i1,j1;
		p1=vecteurPluvios.get(0);

		for (int k=1;k<nblignes-2;k++)
		{ 
			i1=p1.getRadarX();
			j1=p1.getRadarY();

			if ((i1>=souris.x-FenetreZoom.tailleZoom/2 && i1 <souris.x+FenetreZoom.tailleZoom/2
					&& j1>= souris.y-FenetreZoom.tailleZoom/2 && j1< souris.y+FenetreZoom.tailleZoom/2))
			{
				g.setColor(Color.BLACK);				
				g.drawRect((i1-(souris.x-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom,
						(j1-(souris.y-FenetreZoom.tailleZoom/2))*FenetreZoom.facteurZoom,2,2); 
			}
			p1=vecteurPluvios.get(k);
		}  
	}
	
	public int getZoomX() {
		// TODO Auto-generated method stub
		return souris.x;
	}

	public int getZoomY() {
		// TODO Auto-generated method stub
		return souris.y;
	}
}
